"""
归并排序（英语：Merge sort，或mergesort），是创建在归并操作上的一种有效的排序算法。该算法是采用分治法（Divide and Conquer）的一个非常典型的应用。

分治法:
    分割：递归地把当前序列平均分割成两半。
    集成：在保持元素顺序的同时将上一步得到的子序列集成到一起（归并）。
时间复杂度：O(N log N)
"""


def merge_sort(arr):
    n = len(arr)
    if n <= 1:
        return arr
    num = int(n / 2)
    left = merge_sort(arr[:num])
    right = merge_sort((arr[num:]))
    return merge(left, right)


def merge(left, right):
    r, l = 0, 0
    result = []
    while l < len(left) and r < len(right):
        if left[l] <= right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1
    result += list(left[l:])
    result += list(right[r:])
    return result


if __name__ == '__main__':
    test_arr = [12, 11, 13, 5, 6, 7]
    new_test_arr = merge_sort(test_arr)
    print(new_test_arr)
